package cn.xdf.docenhance

import android.content.Context
import android.graphics.Bitmap
import android.util.Log

/**
 * ML Kit 文档增强引擎（占位实现，具备回退）。
 * - 首选调用 ML Kit DocumentEnhancer（若运行环境可用）
 * - 不可用时回退到 fallbackEngine（默认为 SimpleCpuEngine）
 */
class MlkitDocumentEngine(
    private val context: Context,
//    private val fallbackEngine: Enhancer.EnhanceEngine = SimpleCpuEngine()
) : Enhancer.EnhanceEngine {

    override fun enhance(input: Bitmap, options: Enhancer.EnhanceOptions): Bitmap {
        // JNI 优先，失败回退到 CPU 实现
        try {
            // 预设滤镜优先级
            val preset = options.presetFilter
            if (preset != null) {
                return when (preset) {
                    0 -> input // ORIGINAL
                    1 -> { // AUTO：优先尝试 autoEnhanceNative，失败则退化到 enhanceColor
                        val out = Bitmap.createBitmap(input.width, input.height, Bitmap.Config.ARGB_8888)
                        val ok = try {
                            val code = com.google.mlkit.vision.docscan.pipeline.common.OpenCVUtils
                                .autoEnhanceNative(null, input, out)
                            code != -1
                        } catch (_: Throwable) { false }
                        if (ok) out else runEnhanceColorOrFallback(input, options)
                    }
                    2 -> { // COLOR：原版未实现，退化到增强颜色
                        runEnhanceColorOrFallback(input, options)
                    }
                    3 -> { // GRAYSCALE：走 CPU 灰度
                        SimpleCpuEngine().enhance(input, options.copy(presetFilter = 1))
                    }
                    4 -> { // BLACK_AND_WHITE：JNI
                        val out = Bitmap.createBitmap(input.width, input.height, Bitmap.Config.ARGB_8888)
                        try {
                            com.google.mlkit.vision.docscan.pipeline.common.OpenCVUtils
                                .convertToBlackAndWhite(input, out)
                            out
                        } catch (t: Throwable) {
                            Log.w(TAG, "convertToBlackAndWhite failed, fallback", t)
                            SimpleCpuEngine().enhance(input, options)
                        }
                    }
                    else -> input
                }
            }

            // 参数增强路径：enhanceColor
            return runEnhanceColorOrFallback(input, options)
        } catch (t: Throwable) {
            Log.e(TAG, "JNI path failed, fallback to CPU", t)
            return SimpleCpuEngine().enhance(input, options)
        }
    }

    private fun runEnhanceColorOrFallback(input: Bitmap, options: Enhancer.EnhanceOptions): Bitmap {
        return try {
            val out = Bitmap.createBitmap(input.width, input.height, Bitmap.Config.ARGB_8888)
            com.google.mlkit.vision.docscan.pipeline.common.OpenCVUtils.enhanceColor(
                input,
                options.textEnhanceLevel.coerceIn(0f, 1f),
                options.enableTextEnhance,
                options.lightnessLevel.coerceIn(-1f, 1f),
                options.enableLightness,
                out
            )
            out
        } catch (t: Throwable) {
            Log.w(TAG, "enhanceColor JNI failed, fallback to CPU", t)
            SimpleCpuEngine().enhance(input, options)
        }
    }

    /**
     * 通过反射尝试构建 ML Kit 的 DocumentEnhancer 实例。
     * 说明：完整对接需可选模块/Play服务环境支持；本方法若探测失败则返回 null。
     */
    @Suppress("UNCHECKED_CAST")
    private fun tryCreateEnhancerImpl(options: Enhancer.EnhanceOptions): DocumentEnhancerBridge? {
        return try {
            // 探测类是否存在（GMSCore 可选模块中）
            val clazz = Class.forName("com.google.mlkit.vision.document.enhance.internal.DocumentEnhancerImpl")
            // 仅作为存在性检查；具体构建需要其依赖的选项类（tfe/tfd 等），
            // 在当前开源环境不可直接引用，因此这里返回 null，走回退。
            null
        } catch (_: Throwable) {
            null
        }
    }

    private interface DocumentEnhancerBridge {
        fun process(input: Bitmap): Bitmap
    }

    private companion object { const val TAG = "MlkitDocumentEngine" }
}


